﻿using BLevy.Entidad;
using BLevy.Negocio;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BLevy.UI.Utils
{
    public class DebitoBanco
    {
        private string tipo_novedad = "D";
        private string cuit_originante = "30711705402";
        private string sector = "001";
        private string prestacion = "LEVY SH";
        private string fecha_vencimiento;
        private string cbu_bloque_1;
        private string filler_cbu_2 = "000";
        private string cbu_bloque_2;
        private string identificacion_cliente;        
        private string empresa = "M";
        private string vencimiento_debito = string.Empty;
        private string opcional;
        private string importe;
        private string moneda_debito = "80";
        private string vencimiento_2 = "00000000";
        private string importe_2 = "0000000000";
        private string vencimiento_3 = "00000000";
        private string importe_3 = "0000000000";

        private string total_tipo_novedad = "T";
        private string total_cant_reg_totales;
        private string total_cant_reg_monetarios;
        private string total_cant_reg_nomonetarios = "0000000";
        private string total_fecha_proceso;
        private string total_filler_1 = string.Empty;
        private string total_suma_importes;
        private string total_filler_2 = string.Empty;
            


        public DebitoBanco ()
        {

        }


        public String UnificarArchivo(string ruta_mercedes, string ruta_curuzu)
        {
            int cantidad_debitos = 0;
            double importe_total = 0;

            string archivo_nombre = "EO054 LEVY HNOS " + DateTime.Now.AddMonths(1).ToString("MMM").ToUpper() +
                    " " + DateTime.Now.ToString("yy") + ".txt";

            string ruta_archivo =
            Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\" + archivo_nombre;
            StreamWriter writer = new StreamWriter(ruta_archivo);
           
            try
            {                
                DateTime fecha_actual = DateTime.Now;
                int dia_actual = fecha_actual.Day;
                int mes_actual = fecha_actual.Month;
                int ano_actual = fecha_actual.Year;

                total_fecha_proceso = String.Format("{0:00}", dia_actual) +
                    String.Format("{0:00}", mes_actual) + ano_actual.ToString();


                using (StreamReader reader = new StreamReader(ruta_mercedes))
                {
                    string linea;

                    while ((linea = reader.ReadLine()) != null)
                    {
                        writer.WriteLine(linea);

                        double importe = Convert.ToDouble(linea.Substring(103, 8));
                        importe_total += importe;
                        cantidad_debitos = cantidad_debitos + 1;
                    }

                }

                using (StreamReader reader = new StreamReader(ruta_curuzu))
                {
                    string linea;

                    while ((linea = reader.ReadLine()) != null)
                    {
                        writer.WriteLine(linea);

                        double importe = Convert.ToDouble(linea.Substring(103, 8));
                        importe_total += importe;
                        cantidad_debitos = cantidad_debitos + 1;
                    }

                    //calculo los totales
                    total_cant_reg_totales = cantidad_debitos.ToString();
                    total_cant_reg_monetarios = cantidad_debitos.ToString();
                    total_suma_importes = importe_total.ToString().PadLeft(8, '0');
                    total_suma_importes = total_suma_importes.PadRight(10, '0');

                    string linea_total = total_tipo_novedad +
                        total_cant_reg_totales.ToString().PadLeft(10, '0') +
                        total_cant_reg_monetarios.ToString().PadLeft(7, '0') +
                        total_cant_reg_nomonetarios +
                        total_fecha_proceso +
                        total_filler_1.PadRight(70, ' ') +
                        total_suma_importes +
                        total_filler_2.PadRight(137, ' ');

                    writer.WriteLine(linea_total);
                    writer.Close();
                }
            }
            catch(Exception ex)
            {
                throw ex;
            }

            return ruta_archivo;
        }

        


        public String GenerarArchivo()
        {
            string ruta_archivo = string.Empty;

            try
            {
                Empresa _empresa = Empresas.FindDatos("E");
                _empresa.localidad = Localidades.FindById(_empresa.localidad_id);

                empresa = _empresa.localidad.localidad.Substring(0, 1);

                string archivo_nombre = _empresa.localidad.localidad +
                   " - " + DateTime.Now.ToString("MM/yy").Replace("/", "-") + ".txt";

                ruta_archivo =
                Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\" + archivo_nombre;
                StreamWriter writer = new StreamWriter(ruta_archivo);
                //obtengo los cupones que tengan forma de pago debito
                IList<Cupon> cuponesL = Cupones.GetAllCuponesAImprimir().Where(x => x.socio.formapago.debito_automatico == 1).ToList();

                int cantidad_debitos = 0;
                double importe_total = 0;

                DateTime fecha_actual = DateTime.Now;
                int dia_actual = fecha_actual.Day;
                int mes_actual = fecha_actual.Month;
                int ano_actual = fecha_actual.Year;

                total_fecha_proceso = String.Format("{0:00}", dia_actual) +
                    String.Format("{0:00}", mes_actual) + ano_actual.ToString();

                IList<StructDebito> Debitos = new List<StructDebito>();
                int i = 1;

                //los recorro
                foreach (Cupon cupon in cuponesL)
                {
                    //obtengo los periodos incluidos en el cupon
                    IList<Periodo> periodosL = Periodos.GetPeriodosByIdCupon(cupon.id);
                    periodosL.OrderByDescending(x => x.fecha_generacion);

                    //obtengo la fecha de vencimiento
                    int dia = periodosL[0].vencimiento_1.Day;
                    int mes = periodosL[0].vencimiento_1.Month;
                    int ano = periodosL[0].vencimiento_1.Year;

                    fecha_vencimiento = String.Format("{0:00}", dia) +
                    String.Format("{0:00}", mes) + ano.ToString();

                    //obtengo los datos de la cuenta bancaria sobre la que se realizara el debito
                    CuentaBancaria cuenta = CuentasBancarias.FindByIdSocio(cupon.socio_id);
                    //obtnego el titular del grupo familiar
                    Socio socio = Negocio.Socios.FindById(cupon.socio_id);
                    //completo y formateo los campos
                    string nombre_completo = cuenta.apellido + " " + cuenta.nombres;
                    int longitud_nombre = nombre_completo.Length;
                    int longitud_certificado = socio.numero_certificado.ToString().Length;
                    int caracteres_nombre = 21 - longitud_certificado;
                    int longitud_cbu = cuenta.cbu.Length;
                    cbu_bloque_1 = cuenta.cbu.Substring(0, 8);
                    cbu_bloque_2 = cuenta.cbu.Substring(8, 14);
                    vencimiento_debito = vencimiento_debito.PadRight(8, ' ');
                    identificacion_cliente = nombre_completo.PadRight(caracteres_nombre, ' ').Substring(0, caracteres_nombre);

                    opcional = ("LEVY" + cupon.numero.Remove(0, 5) + " " + periodosL.Count.ToString()).PadRight(15, ' ');
                    //obtengo el importe
                    importe = cupon.total.ToString().PadLeft(8, '0');
                    importe = importe.PadRight(10, '0');

                    //agrego la linea al archivo
                    string linea = tipo_novedad +
                        cuit_originante +
                        sector +
                        prestacion.PadRight(10, ' ') +
                        fecha_vencimiento +
                        cbu_bloque_1 +
                        filler_cbu_2 +
                        cbu_bloque_2 +
                        identificacion_cliente +
                        socio.numero_certificado +
                        empresa +
                        vencimiento_debito +
                        opcional +
                        importe +
                        moneda_debito +
                        vencimiento_2 +
                        importe_2 +
                        vencimiento_3 +
                        importe_3;

                    writer.WriteLine(linea);

                    //calculo los totales
                    importe_total = importe_total + cupon.total;
                    cantidad_debitos = cantidad_debitos + 1;

                    //Envio los datos a la Estructura para el reporte
                    StructDebito datos_socio = new StructDebito();
                    datos_socio.posicion = i;
                    datos_socio.apellido = socio.apellido;
                    datos_socio.nombres = socio.nombres;
                    datos_socio.numero_certificado = socio.numero_certificado;
                    datos_socio.documento = socio.documento;
                    datos_socio.cantidad_periodos = periodosL.Count;
                    datos_socio.cuota = (cupon.total / periodosL.Count);
                    datos_socio.importe = cupon.total;
                    datos_socio.vencimiento = vencimiento_debito;

                    Debitos.Add(datos_socio);

                    //incremento el contador en 1
                    i += 1;
                }

                //calculo los totales
                total_cant_reg_totales = cantidad_debitos.ToString();
                total_cant_reg_monetarios = cantidad_debitos.ToString();
                total_suma_importes = importe_total.ToString().PadLeft(8, '0');
                total_suma_importes = total_suma_importes.PadRight(10, '0');

                string linea_total = total_tipo_novedad +
                    total_cant_reg_totales.ToString().PadLeft(10, '0') +
                    total_cant_reg_monetarios.ToString().PadLeft(7, '0') +
                    total_cant_reg_nomonetarios +
                    total_fecha_proceso +
                    total_filler_1.PadRight(70, ' ') +
                    total_suma_importes +
                    total_filler_2.PadRight(137, ' ');

                //writer.WriteLine(linea_total);


                writer.Close();

                DialogResult dialog = MessageBox.Show("Desea generar la Declaración Jurada y Listado?", "Información", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (dialog == System.Windows.Forms.DialogResult.Yes)
                {
                    frmDebitoListadoReporte frm = new frmDebitoListadoReporte(Debitos);
                    frm.Show();
                }


            }
            catch(Exception ex)
            {
                throw ex;
            }

            return ruta_archivo;
        }

        public struct StructDebito
        {
            public int posicion;
            public string apellido;
            public string nombres;
            public long numero_certificado;
            public string documento;
            public int cantidad_periodos;
            public double cuota;
            public double importe;
            public string vencimiento;
        }

    }
}
